
import {HOST} from'@/common/utils/constants.js'
var loadImg = function(imgName){
  return `${HOST}/${imgName}`;
} 

var goToPage = function (url, query, type = '') {
  if (query) { //Url参数
    Object.getOwnPropertyNames(query).forEach((key, index, array) => {
      if (index == 0) url += "?"
      else url += "&"
      url += `${key}=${query[key]}`;
    });
  }
  switch (type) {
    case '':
      //保留当前页面，跳转到应用内的某个页面，使用uni.navigateBack可以返回到原页面
      uni.navigateTo({ url: url });
      break;
    case 'reLaunch':
      //关闭所有页面，打开到应用内的某个页面
      uni.reLaunch({ url: url });
      break;
    case 'redirectTo':
      //关闭当前页面，跳转到应用内的某个页面
      uni.redirectTo({ url: url });
      break;
    case 'navigateBack':
      //返回的页面数，如果 delta 大于现有页面数，则返回到首页
      uni.navigateBack({ delta: 2 });
      break;
    case 'switchTab':
      // 跳转到 TabBars 页面，并关闭其他所有非 TabBars 页面。
      uni.switchTab({
        url: url
      });
      break;

  }

}
function goBack() {
  uni.navigateBack({
    delta: 1
  });
}

function getCurrentRoute() {
  const pages = getCurrentPages();
  let currentRoute = pages[pages.length - 1];
  return currentRoute.route;
}

function formatNumber(n = 0, toFixedLenth = 2) {
  n = (n * 1).toFixed(toFixedLenth);
  var re = /\d{1,3}(?=(\d{3})+$)/g;
  var n1 = n.replace(/^(\d+)((\.\d+)?)$/, function (s, s1, s2) {
    return s1.replace(re, "$&,") + s2;
  });
  return n1;
}


function oneToWan(n = 0, toFixedLenth = 0,) {
  n = n / 10000;
  n = (n * 1).toFixed(toFixedLenth);
  var re = /\d{1,3}(?=(\d{3})+$)/g;
  var n1 = n.replace(/^(\d+)((\.\d+)?)$/, function (s, s1, s2) {
    return s1.replace(re, "$&,") + s2;
  });
  return n1;
}


const debounce = (fn, wait, immediate) => {
  // fn执行函数,wait等待时间,immediate是否立即执行
  var timeout, contex, args, result;
  //timeout 定时器;context 执行上下文；args 保存event事件；result立即执行返回return;
  return function () {
    clearTimeout(timeout);
    contex = this;
    args = arguments;
    if (immediate) {
      //立即执行
      var callNow = !timeout;
      timeout = setTimeout(() => {
        timeout = null;
      }, wait);
      if (callNow) fn.apply(contex, args);
    } else {
      //延迟执行
      timeout = setTimeout(() => {
        fn.apply(contex, args);
      }, wait);
    }
    return result;
  };
};

//节流：
// 原理：如果持续触发事件，每一段时间，只执行一次
//形参中的 fn ，是指自己根据需求写的方法
//delay , 是打算多久执行一次方法的时间
const throttle = (fn, delay) => {
  //进入的时间，其实就是用户什么时候 触发 的 滚动条
  var enterTime = 0;
  var gapTime = delay || 200; //间隔时间
  return function () {
    var context = this;
    //第一次 执行 return 里面的匿名函数方法的时间
    var backTime = new Date();
    // 用户 触发 到 执行是需要时间的，因此 如果 执行匿名函数方法的时间 减去 出发的时间 大于间隔的时间，就进行函数的触发；
    if (backTime - enterTime > gapTime) {
      fn.apply(context, arguments);
      //把执行匿名函数方法的时间保存 到 触发的时间，以便 第二次运行函数
      enterTime = backTime
    }
  }
}

const formatDate = (date, fmt) => {
  if (!date) return;
  var type = Object.prototype.toString.call(date),
    newDate;
  if (type.includes("String")) {
    newDate = new Date(date.replace(/-/g, "/").replace(".0000000", "")); //解决ios不兼容-
  }
  if (type.includes("Date")) {
    newDate = date;
  }
  if (type.includes("[object String]")) {
    newDate = new Date(date);
  }
  if (newDate.toString() == "Invalid Date") {
    return (
      date + "格式误，正确格式如：1999-1-9或1999/01/9或一个new Date(xxx)日期"
    );
  }
  var o = {
    "M+": newDate.getMonth() + 1, //月份
    "d+": newDate.getDate(), //日
    "h+": newDate.getHours(), //小时
    "m+": newDate.getMinutes(), //分
    "s+": newDate.getSeconds(), //秒
    "q+": Math.floor((newDate.getMonth() + 3) / 3), //季度
    S: newDate.getMilliseconds(), //毫秒
  };
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (newDate.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  }
  for (var k in o) {
    if (new RegExp("(" + k + ")").test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
      );
    }
  }
  return fmt;
};

/**
 * 将枚举以及其对应的描述对象，配对转化为数组
 * @param source 源枚举
 * @param map 枚举对应的 Text 说明
 */
function enumMapping(source, map) {
  return Object.keys(map).map(key => ({ value: source[key], label: map[key], disabled: false }));
}

/**
 * 获取枚举描述
 * @param source 源枚举
 * @param map 枚举对应的 Text 说明
 * @param value 枚举值
 */
function getEnumText(source, map, value) {
  const arr = Object.keys(map).map(key => ({ value: source[key], label: map[key], disabled: false }));
  const obj = arr.filter(i => i.value === value);
  return obj && obj.length > 0 ? obj[0].label : '未知';
}

/**
 * 对象转url参数
 */
function objToUrlParam(params, append = true) {
  var query = '';
  Object.getOwnPropertyNames(params).forEach((key, index, array) => {
    if (key !== '__ob__') {
      if (params[key]) {
        if (append && index === 0) {
          query += "?";
        }
        else {
          query += "&";
        }
        query += `${key}=${params[key]}`;
      }
    }

  });
  return query;
}

// 打开pdf文件
// url pdf文件地址  title pdf文件名称
const downloadFile = (pdfUrl = '', title = '') => {
  const reg = /(\w*)《(.*)》/g;
  uni.getSystemInfo({
    success: function (sysRes) {
      if (sysRes.platform === 'ios') {
        uni.navigateTo({ url: `/pagesOther/webview/index?title=${title}&url=${encodeURIComponent(pdfUrl)}` });
      } else {
        uni.showLoading({
          title: "下载中，请稍后...",
          mask: true,
        });
        uni.downloadFile({
          url: pdfUrl,
          success: function (res) {
            uni.hideLoading();
            uni.openDocument({
              filePath: res.tempFilePath,
              fileType: "pdf",
              success: function (res) {
              },
            });
          },
          fail: function (res) {
            uni.hideLoading();
            uni.showToast({
              title: "下载失败",
              icon: "none",
            });
          },
        });
      }
    },
    fail: function (err) {
      uni.showToast({
        title: '获取系统信息失败',
        icon: 'none',
        duration: 2000
      });
    }
  })
};

function guid() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
      .toString(16)
      .substring(1);
  }
  return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
    s4() + '-' + s4() + s4() + s4();
}

function formatDuring(mss) {
  var days = parseInt(mss / (1000 * 60 * 60 * 24));
  var hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = (mss % (1000 * 60)) / 1000;
  hours = hours;
  minutes = minutes;
  let level1 = 7 * 24 * 60 * 60 * 1000,
    level2 = 24 * 60 * 60 * 1000,
    level3 = 60 * 60 * 1000;
  if (mss > level1) {
    return days + "天";
  } else if (mss > level2) {
    return days + "天" + (hours ? hours + "小时" : "");
  } else if (mss > level3) {
    return hours + "小时";
  } else {
    return minutes + "分钟";
  }
}

// 浮点数的精确运算
// 加
const add = (...nums) => {
  var lenArr = [];
  var numArr = [];
  var n;
  var res = 0;
  nums.map((item) => {
    lenArr.push(item.toString().length);
  });
  lenArr.sort(function (a, b) {
    return b - a;
  });
  n = Math.pow(10, lenArr[0]);
  nums.map((item) => {
    res += item * n;
  });
  return res / n;
};
// 减
const minus = (a, b) => {
  var n1 = a.toString().length;
  var n2 = b.toString().length;
  var num = n1 > n2 ? Math.pow(10, n1) : Math.pow(10, n2);
  return (a * num - b * num) / num;
};
// 乘
const multiply = (...nums) => {
  var lenArr = [];
  var numArr = [];
  var n = 1;
  var res = 1;
  nums.map((item) => {
    lenArr.push(item.toString().length);
  });
  for (var i = 0; i < lenArr.length; i++) {
    n = n * Math.pow(10, lenArr[i]);
    numArr[i] = nums[i] * Math.pow(10, lenArr[i]);
  }
  numArr.map((item) => {
    res = res * item;
  });
  return res / n;
};

// 除
const divide = (a, b) => {
  var n1 = a.toString().length;
  var n2 = b.toString().length;
  var num = n1 > n2 ? Math.pow(10, n1) : Math.pow(10, n2);
  return (((a * num) / b) * num) / Math.pow(num, 2);
};
/**
 * 8位日期格式化
 * @param {*} dateStr 20231211
 * @param {*} split 分隔串
 * @returns 
 */
const getDate = (dateStr, split = "-") => {
  if (!dateStr) return "";
  return `${dateStr.substr(0, 4)}${split}${dateStr.substr(
    4,
    2
  )}${split}${dateStr.substr(6)}`;
};

export default {
  loadImg,
  formatDate, //格式化日期
  getCurrentRoute,
  debounce, // 防抖
  throttle, //节流
  formatNumber, //字符串数字千分位
  oneToWan,//元转换为万元
  goToPage, // 跳转到另外的页面
  goBack,
  enumMapping,
  getEnumText,
  objToUrlParam,
  downloadFile,
  guid,
  formatDuring,
  add,
  minus,
  multiply,
  getDate
};
